package cn.itcast.myapplication.room;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.Database;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

/**
 *
 *  这里需要到四个参数
 *  第一个是entities 需要到一个集合因为这里只要一个参数所以我们带Word.class 有多个可以用逗号继续来写
 *  第二个是版本 版本是一个比较关键的参数，每次数据库的结构发生改变之后，这个版本也是需要修改，比如：添加了一个新的字段，那么就说明是数据库的结构发生改变了，那版本就要增加
 *  第三个是exportSchema我们把它设为false
 *
 */
//Singleton
@Database(entities = {Word.class}, version = 5,exportSchema = false)

public abstract class WordDatabase extends RoomDatabase {

    public static WordDatabase INSTANCE;//单例 防止数据库被多次创建

    //使用线程锁防止线程被多个对象当时访问时发生线程安全
    public static synchronized WordDatabase getINSTANCE(Context context){

      //判断数据库是否为空，为空则创建
      if (INSTANCE==null){

           //创建数据库
          INSTANCE= Room.databaseBuilder(context,WordDatabase.class,"word_database")
                  .addMigrations(MIGRATION_4_5)
                  .build();

       }

       return INSTANCE;

    }

    //若有多个Entity，则应该写多个Dao
    public abstract WordDao getWordDao();

    static final Migration MIGRATION_2_3=new Migration(1,2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

            database.execSQL("ALTER TABLE word ADD COLUMN bar_data INTEGER NOT NULL DEFAULT 1");

        }
    };


      /**
       *
       * 这里是每次更新版本都要在这里声明一下你加入的字段，还有版本号也要改，不然会报错，再编译不通过可以将应用卸载重装就行
       *
       */


    static final Migration MIGRATION_3_4=new Migration(3,4) {

        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

            database.execSQL("CREATE TABLE word_temp(id INTEGER PRIMARY KEY NOT NULL , english_word TEXT,"+"chinese_meaning Text)");
            database.execSQL("INSERT INTO word_temp (id,english_word,chinese_meaning)"+"SELECT id english_word,chinese_meaning FROM word");
            database.execSQL("DROP TABLE word");
            database.execSQL("ALTER TABLE word_temp RENAME to word");

        }

    };

    static final Migration MIGRATION_4_5=new Migration(4,5) {

        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

            database.execSQL("ALTER TABLE word ADD COLUMN chinese_invisible INTEGER NOT NULL DEFAULT 0");

        }
    };

}